/*
 * miscdev.h
 *
 *  Created on: May 19, 2025
 *      Author: Li Jiahui <2199250859@qq.com>
 */
#include "stm32l4xx_hal.h"

#ifndef __MISCDEV_H
#define __MISCDEV_H

#include <stdio.h>

/* 定义ON/OFF两个宏，在代码中比使用1/0更有可读性 */
#define OFF 0
#define ON  1

/* 该结构体用来描述这个引脚的相关信息 */
typedef struct gpio_s
{
	const char		*name;
	GPIO_TypeDef	*group;
	uint16_t		pin;
	uint8_t			status;
}gpio_t;


/* GPIO Relay */

typedef enum
{
	Relay1,//继电器1
	RelayMax,//继电器总数，用来做边界检查
}relaynum_t;

/* initial relays GPIO port */
extern int init_relay(void);

/* 控制指定继电器开关 */
extern void turn_relay(int which, int status);

/* 获得指定继电器当前状态 */
extern int status_relay(int which);

/* 定义了一个枚举，表示RGB三个灯的索引
 * 枚举的第一个成员，如果没赋值则其值为0，后面的成员值永远是前面成员的值加1
 *  */
typedef enum
{
	Led_R, //其值为0
	Led_G, //其值为1
	Led_B, //其值为2
	LedMax, //其值为3，刚好是Led的总数
} lednum_t;
#define BITMASK_ALLLED ((1<<LedMax) - 1) /* 位掩码，1左移ledmax位（即3位）为1000，减1得0111，每一位对应一个led，可实现同时控制三个灯或查询灯操作 */

/* Initial LEDs GPIO port */
extern int init_led(void);

extern void turn_led(int which, int status);

extern void toggle_led(int which);

extern void blink_led(int which, uint32_t interval);

extern int status_led(int which);

/* ADC noisy & lux sensor API */

enum
{
	ADCCHN_NOISY,
	ADDCHN_LUX,
	ADCCHN_MAX,
};

extern int adc_sample_lux_noisy(uint32_t *lux, uint32_t *noisy);

/* Timer delay API */
extern void udelay(uint16_t us);

/* Buzzer API */
extern void beep_start(uint16_t times, uint16_t interval);

#endif /* SRC_BOARD_MISCDEV_H_ */